const Main = imports.ui.main;
const Cairo = imports.cairo;
-var PieTimer = GObject.registerClass(
-class PieTimer extends St.DrawingArea {
+var PieTimer = GObject.registerClass({
+ Properties: {
+ 'angle': GObject.ParamSpec.double(
+ 'angle', 'angle', 'angle',
+ GObject.ParamFlags.READWRITE,
+ 0, 2 * Math.PI, 0)
+ }
+}, class PieTimer extends St.DrawingArea {
_init() {
this._x = 0;
this._y = 0;
- this._startTime = 0;
- this._duration = 0;
+ this._angle = 0;
super._init({
style_class: 'pie-timer',
visible: false,
can_focus: false,
reactive: false
});
+ }
- this.connect('notify::opacity', this.queue_repaint.bind(this));
+ get angle() {
+ return this._angle;
+ }
+
+ set angle(angle) {
+ if (this._angle == angle)
+ return;
+
+ this._angle = angle;
+ this.notify('angle');
+ this.queue_repaint();
}
vfunc_repaint() {
let [width, height] = this.get_surface_size();
let radius = Math.min(width / 2, height / 2);
- let currentTime = GLib.get_monotonic_time() / 1000.0;
- let ellapsed = currentTime - this._startTime;
- let angle = (ellapsed / this._duration) * 2 * Math.PI;
let startAngle = 3 * Math.PI / 2;
- let endAngle = startAngle + angle;
+ let endAngle = startAngle + this._angle;
let cr = this.get_context();
cr.setLineCap(Cairo.LineCap.ROUND);
this.x = x - this.width / 2;
this.y = y - this.height / 2;
+ this._angle = 0;
+
this.show();
Main.uiGroup.set_child_above_sibling(this, null);
- this._startTime = GLib.get_monotonic_time() / 1000.0;
- this._duration = duration;
-
- this.ease({
- opacity: 255,
+ this.ease_property('angle', 2 * Math.PI, {
duration,
- mode: Clutter.AnimationMode.EASE_OUT_QUAD,
+ mode: Clutter.AnimationMode.LINEAR,
onComplete: () => this.stop()
});
}